home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A)[a].zip / Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A)[a].po / GS.FX.S < prev    next >
Text File  |  1996-12-24  |  10KB  |  292 lines

  1. *
  2. * GS.FX Source Code
  3. * By Peter Stubbs
  4. * Copyright(c) 1988
  5. * MicroSPARC, Inc.
  6. * Concord, MA 01742
  7. *
  8. * Assembler: MERLIN 16
  9. *
  10.  
  11.           TR ADR
  12.           XC
  13.           XC
  14.           ORG $2000      ;Note: program, as written
  15.                          ;is relocatable and will
  16.                            ;run at any address
  17.  
  18. NEWVIDEO  EQU $C029      ;SuperRes/linear softswitch
  19. WAIT      EQU $FCA8      ;ROM time delay routine
  20. PALPTR    EQU $0         ;3 byte pointer to palette
  21. PALZERO   EQU $3         ;pointer to main palette
  22. MAXBLUE   EQU $6         ;max. value of blue
  23. ENDVAL1   EQU $7         ;max. value of blue/green
  24. ENDVAL2   EQU $8         ;max. value of red
  25. VIDSAVE   EQU $9         ;save video register
  26. CODE      EQU $1A        ;function code poked here
  27. DELAY     EQU $1B        ;delay value
  28.  
  29. START     SEC
  30.           XCE            ;turn emulation mode on
  31.           SEP #$30
  32.  
  33. *
  34. * common code for all three functions
  35. *
  36.  
  37.           LDA NEWVIDEO   ;get setting of NEWVIDEO
  38.           STA VIDSAVE    ;Save for later
  39.           ORA #%01000000 ;turn on linear addressing
  40.           STA NEWVIDEO   ;by setting bit 6
  41.  
  42. * Set up the pointers to our colour palettes
  43.  
  44.           LDA #<$E19FE0  ;Set up PALPTR to point at
  45.           STA PALPTR     ;location of palette F
  46.           LDA #>$E19FE0
  47.           STA PALPTR+1
  48.           LDA #^$E19FE0
  49.           STA PALPTR+2
  50.           LDA #<$E19E00  ;Set up PALZERO to point at
  51.           STA PALZERO    ;location of palette zero
  52.           LDA #>$E19E00
  53.           STA PALZERO+1
  54.           LDA #^$E19E00
  55.           STA PALZERO+2
  56.  
  57. * Branch here depending on which routine you want
  58. JUMPTBL   LDA CODE
  59.           BNE :1
  60.           BRA INFX       ;fade in
  61. :1        CMP #1
  62.           BNE :2
  63.           BRA OUTFX      ;fade out
  64. :2        CMP #2
  65.           BNE :3
  66.           BRL SCROLLFX   ;scroll in
  67.  
  68. :3         JSR $FF3A     ;incorrect code, so ring bell
  69.           BRA EXIT       ; and exit
  70.  
  71. *
  72. INFX      = *            ;Fade-in code starts here
  73. *
  74.  
  75. CLRPAL    LDA #$0        ;Colour to use to clear the
  76.           TAX            ;palettes (00=black)
  77. LOOP0     STAL $E19FE0,X ;Clears Palette $0F
  78.           INX
  79.           CPX #$20       ;are we at end of palette ?
  80.           BNE LOOP0      ;if not zero next byte
  81.           LDY #$1E       ;Start fade from last color
  82.  
  83. FADEIT    PER RETURN1-1  ;relocatable version
  84.           BRL SETUP2     ;of JSR SETUP2
  85. RETURN1   LDA ENDVAL1    ;Get max val of blue/green
  86.           BEQ DONE2      ;if = 0 is no need to fade
  87.           LDX #$FF       ;so X=0 after next line
  88. COLORUP   INX            ;turn blue intensity up 1
  89.           TXA            ;(changes bits 3-0 only)
  90.           STA [PALPTR],Y ;Set the new intensity
  91.                          ;in the colour table
  92.           PER RETURN3-1  ;relocatable version
  93.           BRL PAUSE      ;of JSR PAUSE
  94. RETURN3   CPX MAXBLUE    ;at maximum blue value yet ?
  95.           BNE COLORUP    ;if not loop back
  96.           LDA ENDVAL1    ;else check green component
  97.           CMP #$10       ;is this lowest intensity?
  98.           BLT DONE2      ;if yes skip add'n for now
  99. DONE1     TXA            ;bump bits 7-4 (green bits)
  100. COLORUP2  CLC            ;up one intensity by adding
  101.           ADC #$10       ;#%00010000 ($10)
  102.           STA [PALPTR],Y ;save new value
  103.  
  104.           PER RETURN4-1  ;relocatable version
  105.           BRL PAUSE      ;of JSR PAUSE
  106. RETURN4   CMP ENDVAL1    ;at max val for blue/green ?
  107.           BNE COLORUP2   ;if not cycle again
  108. DONE2     LDX #$FF       ;else start on red byte
  109. COLORUP3  INX
  110.           TXA
  111.           INY            ;To point at high byte
  112.           STA [PALPTR],Y ;zero high byte
  113.           DEY            ;restore Y
  114.  
  115.           PER RETURN5-1  ;relocatable version
  116.           BRL PAUSE      ;of JSR PAUSE
  117. RETURN5   CPX ENDVAL2    ;at max for this colour?
  118.           BNE COLORUP3   ;if not, loop back
  119.           DEY            ;move to next colour down
  120.           DEY            ;by moving two bytes down
  121.           BPL FADEIT     ;cycle until color 0 done
  122.  
  123. EXIT      LDA VIDSAVE    ;Restore original NEWVIDEO
  124.           STA  NEWVIDEO
  125.           RTS            ;And exit
  126.  
  127. *
  128. OUTFX     = *            ;fade-out effect starts here
  129. *
  130.  
  131. COPYPAL   LDY #$00       ;Start at colour zero
  132. OLOOP0    LDA [PALZERO],Y ;get blue/green byte from
  133.           TYX            ;palette zero and put it in
  134.           STAL $E19FE0,X ;same position in pal. $F
  135.           INY
  136.           LDA [PALZERO],Y ;Get the red colour byte
  137.           TYX            ;make X = Y
  138.           STAL $E19FE0,X ;and copy red colour byte
  139.           INY
  140.           CPY #$20       ;Are we at the end
  141.           BNE OLOOP0
  142.           LDY #$00       ;Start fade from 1st colour
  143. OFADEIT   PER ORETURN1-1 ;Relocatable version
  144.           BRL SETUP2     ;of JSR SETUP2
  145. ORETURN1  LDX ENDVAL2    ;Get max val of red byte
  146. OCLRDWN3  TXA
  147.           INY            ;To point at high byte
  148.           STA [PALPTR],Y ;update red colour byte
  149.           DEY            ;point Y back at low byte
  150.           PER ORETURN2-1 ;Relocatable version
  151.           BRL PAUSE      ;of JSR PAUSE
  152. ORETURN2  DEX            ;turn red intensity down 1
  153.           CPX #$FF       ;Wrapped from $0 ?
  154.           BNE OCLRDWN3   ;if not, reloop
  155.           LDX ENDVAL1    ;get max blue/green byte
  156.           TXA
  157. OCLRDWN2  STA [PALPTR],Y ;update green colour byte
  158.           PER ORETURN3-1 ;relocatable version
  159.           BRL PAUSE      ;of JSR PAUSE
  160. ORETURN3  CMP #$10       ;lowest intensity ?
  161.           BLT ODONE      ;if yes, skip the subtract
  162.           SEC            ;drop bits 7-4 (green) by 1
  163.           SBC #$10       ;by subtracting #%00010000
  164.           BRA OCLRDWN2   ;(leaves blue unchanged)
  165. ODONE     LDX MAXBLUE    ;get maximum blue intensity
  166. OCOLRDWN  TXA
  167.           STA [PALPTR],Y ;update the blue/green
  168.           PER ORETURN4-1 ;relocatable version
  169.           BRL PAUSE      ;of JSR PAUSE
  170. ORETURN4  DEX            ;turn blue intensity down 1
  171.           CPX #$FF       ;Wrapped from $0 ?
  172.           BNE OCOLRDWN   ;no, so reloop
  173.           INY            ;move to next colour up
  174.           INY            ;by moving two bytes up
  175.           CPY #$20       ;at end of the palette ?
  176.           BNE OFADEIT    ;if not, loop back
  177.  
  178. ORTS      LDA VIDSAVE
  179.           STA NEWVIDEO
  180.           RTS
  181.  
  182. *
  183. SCROLLFX  = *            ;scroll code starts here
  184. *
  185.  
  186. SCLRPAL   LDA #$0        ;Colour to use to clear the
  187.           TAX            ;palettes (00=black)
  188. SLOOP0    STAL $E19FE0,X ;Clear Palette $F
  189.           STAL $E19FC0,X ;Clear Palette $E
  190.           INX
  191.           CPX #$20       ;At end of palette ?
  192.           BNE SLOOP0     ;if not zero next byte
  193.           LDA #$E        ;Start with palette $0E
  194.           PER SRETURN0-1 ;relocatable version
  195.           BRL SCLRSCB    ;of JSR CLRSCB
  196. SRETURN0  LDY #$20       ;start with colour $0F (at
  197. SLOOP1    DEY            ;byte $1F in palette & copy
  198.           LDA [PALZERO],Y;it from palette $00 to
  199.           TYX            ;palette $0F
  200.           STAL $E19FE0,X ;Store high byte of colour
  201.           DEY            ;in palette $0F
  202.           LDA [PALZERO],Y
  203.           TYX
  204.           STAL $E19FE0,X ;Store low byte in pal. $0F
  205.           LDA #$F        ;Display palette for SCB's
  206.           PER SRETURN1-1 ;relocatable version
  207.           BRL SCLRSCB    ;of JSR sCLRSCB
  208. SRETURN1  INY
  209.           LDA [PALZERO],Y ;Make pal. $0E same as $0F
  210.           TYX
  211.           STAL $E19FC0,X ;Store high byte in pal $0E
  212.           DEY
  213.           LDA [PALZERO],Y
  214.           TYX
  215.           STAL $E19FC0,X ;store low byte in pal. $0E
  216.           DEY            ;while we're seeing pal $0F
  217.           LDA [PALZERO],Y ;move one more colour into
  218.           TYX            ;pal. $0E from pal. $00
  219.           STAL $E19FC0,X ;store high byte
  220.           DEY
  221.           LDA [PALZERO],Y
  222.           TYX
  223.           STAL $E19FC0,X ;store low byte
  224.           LDA #$E        ;display palette for SCB's
  225.           PER SRETURN2-1 ;relocatable version
  226.           BRL CLRSCB     ;of JSR CLRSCB
  227. SRETURN2  INY
  228.           LDA [PALZERO],Y ;Make pal. $0F same as $0E
  229.           TYX
  230.           STAL $E19FE0,X ;store high byte
  231.           DEY
  232.           LDA [PALZERO],Y
  233.           TYX
  234.           STAL $E19FE0,X ;store low byte
  235.           CPY #$0        ;done scrolling all colors?
  236.           BNE SLOOP1     ;if not cycle through again
  237.  
  238. SEXIT     LDA VIDSAVE    ;Restore original NEWVIDEO
  239.           STA NEWVIDEO
  240.           RTS            ;And exit
  241.  
  242. SCLRSCB   LDX #0
  243. SLOOP     STAL $E19D00,X ;point all SCB's at the
  244. SPAUSE    PHA            ;save accumulator
  245.           LDA DELAY      ;get delay value
  246.           JSR WAIT       ;call pause ROM routine
  247. NOKEY     PLA            ;restore accumulator
  248. SRETURN6  INX            ;palette in the acc.
  249.           CPX #$C8       ;SCB's end at $E19DC8
  250.           BNE SLOOP
  251.  
  252. * Setup is finished so display the screen
  253.  
  254.           LDA NEWVIDEO
  255.           ORA #%11000000  ;Turn on linear addressing and super hi
  256.           STA NEWVIDEO
  257.           RTS
  258.  
  259. *
  260. * common code for in & out effects
  261. *
  262.  
  263. SETUP2    LDA [PALZERO],Y ;Get blue/green byte of
  264.           STA ENDVAL1    ;colour and save it
  265.           AND #%00001111 ;Get intensity of Blue
  266.           STA MAXBLUE    ;and save it
  267.           INY            ;so Y indexes high byte
  268.           LDA [PALZERO],Y ;Get red byte of colour
  269.           STA ENDVAL2    ;and save it
  270.           DEY            ;so Y indexes low byte
  271.           LDA #$F        ;So we use palette F
  272. CLRSCB    LDX #0
  273. LOOP      STAL $E19D00,X ;point all SCB's at the
  274. RETURN6   INX            ;palette in the acc.
  275.           CPX #$C8       ;SCB's end at $E19DC8
  276.           BNE LOOP
  277.  
  278. * Setup is finished so display the screen
  279.  
  280.           LDA NEWVIDEO
  281.           ORA #%11000000  ;Turn on linear addressing and super hi
  282.           STA NEWVIDEO
  283.           RTS
  284.  
  285. PAUSE     PHA            ;save accumulator
  286.           LDA DELAY      ;get delay value
  287.           JSR WAIT       ;call pause ROM routine
  288.           PLA            ;restore accumulator
  289.           RTS            ;and return
  290. *
  291. END       CHK            ;MERLIN chk = C5
  292.